上一篇有提到說,Service是存在在一個container裡,
而每個service都有一個id,在symfony3和4的差異在於呼叫Service的方法。
Symfony3,大部分的Services都是public的,所以可以透過兩種方法來呼叫
1.利用id直接呼叫
$this->get('service id');
2.從容器裡透過Service呼叫 ,只要Controller控制器有繼承Controller這個類別,就可以呼叫到container
class TestController extends Controller{
public function test (){
$myService=$this->container->get('這裡放serviceId')
}
}
我們要怎麼知道哪個service 代表什麼id呢!!!?
php bin/console debug:container
藍色那一行的最後"token_storage"就是service的id,
為什麼不是整串呢!!!? 因為有一些Service他們的前綴會長的一樣,
若有相同前綴的service,用哪一個都可以達到相同物件的效果
Symfony4,除了大多數的第三方元件都將Service設為private外,
Symfony自己本身大部分的Service也都是private,所以必須透過 Dependency Injection (依賴注入)來呼叫
1.在建構子內呼叫,這樣一來,當程式一載入這個class的時候,建構子內的所有物件會先被初始化(initialized) ,
所以在這個class裡的所有function都可以透過property去呼叫物件或Service
class TestController extends AbstractController(){
private $service;
public function __construct(TestServcie $service)
{
$this->service = $service;
}
}
2.在帶有路由的Controller(Action)呼叫
class TestController extends AbstractController(){
/**
* @Route(
* "/route",
* name="route"
* )
*/
public function testRoute (MyService $service){
}
}
下面舉例一個小菜鳥本人我寫的遮罩功能Service
首先,到src資料夾底下建立一個目錄名為Service,並在此目錄內建立一個Class
接著在裡面建立所要使用的function,以下舉例姓名與地址兩個
其實一開始小菜鳥我是用一堆if寫出來的,那時候才入職不到三個月,但因為大家都很討厭看到波動拳,所以經過改良,改成用switch寫,如果再改良的話,其實可以用陣列寫,不過這又是另一回事了
波動拳,對....就是龍跟肯的那種阿波砍,不用懷疑!!!
public function coverAction($fieldType,$coverData){
switch ($fieldType) {
case "name" :
$isChinese= preg_match("/^[\x7f-\xff]+$/",$coverData);
if($isChinese==1) {
$newCoverData = str_replace(mb_substr($coverData, 1, 1), "*" , $coverData);
return $newCoverData;
}elseif ($isChinese==0){
$newCoverData = str_replace(mb_substr($coverData, 1, 3), "***" , $coverData);
return $newCoverData;
}
break;
case "address" :
$newCoverData = str_replace(mb_substr($coverData, 3, 100), "***************** ***" , $coverData);
return $newCoverData;
}
}
接著,假設我們在一個Action裡透過從建構子呼叫來使用這個Service
class TestCoverController extends AbstractController(){
private $service;
public function __construct(CoverServcie $service)
{
$this->service = $service;
}
/**
* @Route(
* "/route",
* name="route"
* )
*/
public function testRoute (){
$data="黃小敏";
$dataAfterCover=$this->service->coverAction("name",$data);
}
}
這樣一來$dataAfterCover就會是遮罩過後的樣子了,如下圖 ↓
好啦~以上是關於Service的簡單介紹,
下一篇要來介紹的是parameter 參數的設定及使用,還有環境設定,和實體類Entity,
其實老實說.....我一直覺得Entity不就是java裡面說的java bean嗎 !!?